package com.yowasa.xiuxian.engine.message.item;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.yowasa.xiuxian.annoations.CMD;
import com.yowasa.xiuxian.engine.CommonEngine;
import com.yowasa.xiuxian.engine.ItemEngine;
import com.yowasa.xiuxian.engine.item.ItemInterface;
import com.yowasa.xiuxian.engine.message.CmdMessageHandler;
import com.yowasa.xiuxian.entity.bo.item.ItemAttr;
import com.yowasa.xiuxian.entity.bo.item.UserItemBo;
import com.yowasa.xiuxian.entity.bo.user.UserBO;
import com.yowasa.xiuxian.entity.enums.CmdScopeEnum;
import com.yowasa.xiuxian.entity.enums.ItemTypeEnum;
import com.yowasa.xiuxian.entity.enums.QualityEnum;
import com.yowasa.xiuxian.entity.mys.SendMessage;
import com.yowasa.xiuxian.service.helper.ItemHelper;
import com.yowasa.xiuxian.service.helper.MessageHelper;
import com.yowasa.xiuxian.service.helper.UserHelper;
import org.springframework.beans.factory.annotation.Autowired;

import java.text.MessageFormat;
import java.util.List;
import java.util.stream.Collectors;


@CMD(name = "/道具", scope = CmdScopeEnum.ALL)
public class ItemHandler extends CmdMessageHandler {
    @Autowired
    private MessageHelper messageHelper;
    @Autowired
    private UserHelper userHelper;
    @Autowired
    private ItemHelper itemHelper;
    @Autowired
    private ItemEngine itemEngine;



    @Override
    public void execute(SendMessage message) {
        UserBO user = userHelper.checkOpUser(message);
        List<String> params = getAllParam(message);

        if (StringUtils.isEmpty(params.get(0))) {
            messageHelper.replyMys(message, "可以在后面追加 列表 使用 丢弃 等二级指令进行后续操作");
            return;
        }
        if ("列表".equals(params.get(0))) {
            int page = 1;
            String type = "";
            if (params.size() >= 2){
                if(isInteger(params.get(1))){
                    page = Integer.parseInt(params.get(1));
                }else {
                    type = params.get(1);
                }
            }
            if (params.size() >= 3){
                if(isInteger(params.get(2))){
                    page = Integer.parseInt(params.get(2));
                }else {
                    type = params.get(2);
                }
            }
            List<UserItemBo> list = itemHelper.list(user.getId(),page,type);
            StringBuilder sb = new StringBuilder();
            sb.append("可使用/道具 列表 类型 页码 进行筛选了\n类型页码可以不填也可以只填一个，交换顺序也可\n一页展示25条，都不填将展示背包中十件物品\n");
            messageHelper.replyMys(message, sb.append("持有摩拉:").append(user.getUserConfig().getGold()).append("\n持有道具:\n").toString()
                    + list.stream().map(e -> buildItemListDesc(e)).collect(Collectors.joining("\n")));
            return;
        }
        if ("使用".equals(params.get(0))) {
            if (params.size() < 2) {
                messageHelper.replyMys(message, "请在指令之后追加需要使用的道具名");
                return;
            }
            String itemName = params.get(1);
            UserItemBo myItem = itemHelper.getMyItem(user.getId(), itemName);
            if (myItem == null) {
                messageHelper.replyMys(message, MessageFormat.format("背包中没有名为[{0}]的道具", itemName));
                return;
            }

            String msg=itemEngine.useItem(user, myItem);
            messageHelper.replyMys(message, MessageFormat.format("你使用了[{0}],{1}", itemName, msg));
            return;
        }
        if ("丢弃".equals(params.get(0))) {
            if (params.size() < 2) {
                messageHelper.replyMys(message, "请在指令之后追加需要丢弃的道具名");
                return;
            }
            String itemName = params.get(1);
            UserItemBo myItem = itemHelper.getMyItem(user.getId(), itemName);
            if (myItem == null) {
                messageHelper.replyMys(message, MessageFormat.format("背包中没有名为[{0}]的道具", itemName));
                return;
            }
            itemHelper.dropItem(myItem, 1);
            messageHelper.replyMys(message, MessageFormat.format("你丢弃了一个[{0}]", itemName));
            return;
        }

        // 写上自己的id，留个后门
        if ("领取".equals(params.get(0))&&(message.getFrom_user_id().equals("254576762") || message.getFrom_user_id().equals("299331411"))) {
            if (params.size() < 2) {
                messageHelper.replyMys(message, "请在指令之后追加需要领取的道具名");
                return;
            }
            String itemName = params.get(1);
            ItemInterface itemInterface = CommonEngine.ITEM_MAP.get(itemName);
            if (itemInterface == null) {
                messageHelper.replyMys(message, MessageFormat.format("未找到没有名为[{0}]的道具", itemName));
                return;
            }
            if(itemInterface.getType().getId() == 3){
                itemHelper.addEquip(user,itemInterface,1,2);
            }else {
                itemHelper.addItem(user,itemInterface,1);
            }
            messageHelper.replyMys(message, MessageFormat.format("你领取了一个[{0}]", itemName));
            return;
        }

    }

    private String buildItemListDesc(UserItemBo e) {

        String type = ItemTypeEnum.getById(e.getItemType()).getName();
        if(type.equals("装备")){
            ItemAttr itemAttr = JSONUtil.toBean(e.getItemAttr(), ItemAttr.class);
            QualityEnum byId = QualityEnum.getById(itemAttr.getQuality());
            type= type + ("("+byId.getName()+")");
        }
        String exMsg = "";
        if (e.getItemNum() > 1) {
            exMsg = "*" + e.getItemNum();
        }
        return MessageFormat.format("[{0}]{1}{2}", type, e.getItemName(), exMsg);
    }

    public static boolean isInteger(String s) {
        if (StrUtil.isNotBlank(s))
            return s.matches("^[0-9]*$");
        else
            return false;
    }

    public String desc(){
        return new StringBuffer().append("背包道具相关指令，未穿戴的装备也会存在这里\n")
                .append("当同名称不同品质的装备同时存在背包时，请使用装备相关指令进行穿戴\n")
                .append("当不存在同名装备时，可使用 /道具 使用 进行快捷穿戴")
                .toString();

    }
}
